package com.javabasic.algorithm.leetcode;

import java.util.Stack;

/**
 * @Author xiongmin
 * @Description //TODO
 * @Date 2020/7/4 0:11
 * @Version 1.0
 **/
public class LongestValidParentheses {

    /**
     * 解法一：暴力解法，超时了
     * 从最大长度的字串，判断字串是否是合格的，如果是，那么当前字串长度就是结果
     * @param s
     * @return
     */
    public int longestValidParentheses2(String s) {
        int len = s.length();
        Stack<Character> stack = new Stack<>();
        String subStr;
        boolean flag = true;
        for (int k = len; k >= 1; k--) {
            for (int i = 0; i+k-1 < len; i++) {
                subStr = s.substring(i,i+k);
                stack.clear();
                flag = true;
                for (int j = i; j < i+k; j++) {
                    if (s.charAt(j) == '(') {
                        stack.push(s.charAt(j));
                    } else {
                        if (stack.isEmpty()) {
                            flag = false;
                            break;
                        } else {
                            stack.pop();
                        }
                    }
                }
                if (flag && stack.isEmpty()) {
                    return k;
                }
            }
        }
        return 0;
    }

    /**
     * 用栈模拟一遍，将所有无法匹配的括号的位置全部置0
     * 例如: "()(()"的mark为[1, 1, 0, 1, 1]
     * 再例如: ")()((())"的mark为[0, 1, 1, 0, 1, 1, 1, 1]
     * 经过这样的处理后, 此题就变成了寻找最长的连续的1的长度
     * @param s
     * @return
     */
    public int longestValidParentheses3(String s) {
        if (s == null || s.isEmpty()) return 0;
        int len = s.length();
        Stack<Integer> stack = new Stack<>();
        int[] tag = new int[len];


        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                if (!stack.isEmpty()) {
                    tag[stack.pop()] = 1;
                    tag[i] = 1;
                }
            }
        }
        int pre = tag[0];
        int result = 0, flag = 0;
        if (pre == 1) {
            flag++;
        }
        for (int i = 1; i < len; i++) {
            System.out.print(tag[i] + " ");
            if (pre == tag[i]) {
                if (pre == 1) {
                    flag++;
                }
            } else {
                pre = tag[i];
                if (pre == 0) {
                    result = Math.max(result,flag);
                    flag = 0;
                } else {
                    flag++;
                }
            }
        }
        result = Math.max(result,flag);

        return result;
    }

    public int longestValidParentheses(String s) {
        if (s == null || s.isEmpty()) return 0;
        int len = s.length();
        Stack<Character> stack = new Stack<>();
        int tag = 0, result = 0, flag = 0;
        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == '(') {
                stack.push(s.charAt(i));
                if (tag > 0) {
                    flag++;
                    if (flag > 1) {
                        result = Math.max(result,tag);
                        tag = 0;
                    }
                } else {
                    flag = 0;
                }

            } else {
                if (!stack.isEmpty()) {
                    stack.pop();
                    tag += 2;
                }
            }
        }
        if (tag > 0) {
            result = Math.max(result,tag);
            tag = 0;
        }
        return result;
    }

}
